<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    

<script>
// 原型链
// 从对象的__proto__开始,所连接的所有对象,就是我们常说的'原型链'

Object.prototype.hehe = '呵呵';
String.prototype.haha = '哈哈';
var str = 'hello';
var num = 123;
var obj = {a:11,b:22};
var arr = [1,2,3];
var fun = function (){};

// console.log( str.hehe );// '呵呵'
// console.log( num.hehe );// '呵呵'
// console.log( obj.hehe );// '呵呵'
// console.log( arr.hehe );// '呵呵'
// console.log( fun.hehe );// '呵呵'

// console.log( str.haha );// '哈哈'
// console.log( num.haha );// undefined
// console.log( obj.haha );// undefined
// console.log( arr.haha );// undefined
// console.log( fun.haha );// undefined

// 思考:
// 1.为什么上面所有对象都能访问到hehe属性?
// 2.为什么只有str能访问到haha属性?

// 对象查找属性的顺序: 1.在对象自身查找 2.查找对象的__proto__ 3.一直查找到null
// obj.hasOwnProperty(attr)查找obj对象自身是否有attr属性,返回布尔值

/* // 访问对象属性: str.hehe

// 1.在对象自身查找属性
console.log( str.hasOwnProperty('hehe') );// false

// 2.在对象的原型上查找属性
console.log( str.__proto__.hasOwnProperty('hehe') );// false
console.log( String.prototype.hasOwnProperty('hehe') );// false

// 3.继续查找原型对象的原型
console.log( str.__proto__.__proto__.hasOwnProperty('hehe') );// true
console.log( Object.prototype.hasOwnProperty('hehe') );// true

// 所以,str.hehe => '呵呵'
// str => str.__proto__  => str.__proto__.__proto__ => str.__proto__.__proto__.__proto__

// str => String.prototype => Object.prototype => null */


// 访问对象属性: arr.hehe
// arr => arr.__proto__ => arr.__proto__.__proto__ => arr.__proto__.__proto__.__proto__
// arr => Array.prototype => Object.prototype => null


// 访问对象属性: obj.hehe
// obj => obj.__proto__ => obj.__proto__.__proto__
// obj => Object.prototype => null


// 访问对象属性: fun.hehe
// fun => fun.__proto__ => fun.__proto__.__proto__ => fun.__proto__.__proto__.__proto__
// fun => Function.prototype => Object.prototype => null


function Human(n){
    this.name = n;
}
var zhangsan = new Human('张三');
console.log( zhangsan.hehe );// '呵呵'
console.log( zhangsan.haha );// undefined

// zhangsan => zhangsan.__proto__ => zhangsan.__proto__.__proto__ => zhangsan.__proto__.__proto__.__proto__
// zhangsan => Human.prototype => Object.prototype => null

// JS是基于原型机制的
// 原型机制的本质是对象之间的内部连接

</script>
</body>
</html>